package nan.object_oriented;//包
import java.util.Date;
class Main2{//类
    int val=0;//默认权限->包访问权限  只能在同一个包下的类才能访问它
}
/*
继承：
1.Cat、Bird都是Animal，Cat is a Animal，Bird is a Animal。
 */
class Animal{//Animal类
    protected String name;//Animal的姓名
    public Animal(String name){//猫的构造方法传递参数，第三步
        this.name=name;
        this.eat();//此时也发生了动态绑定
    }
    public void eat(){
        System.out.println(this.name+"正在吃!");//第四步
    }
}
class Cat extends Animal{//猫类
   /* public String name;//猫自己的姓名
    public void eat(){
        System.out.println(this.name+"正在吃！");
    }
    */
   //子类继承了父类，所以子类先要帮助父类来构造。
    //但是构造一个对象：只能通过构造方法
    public Cat(String name){
        super(name);//显示的调用父类的构造方法。带有一个参数的构造方法，
        // 这个参数是String类型
        //mimi传给了此时name；（第二步）
    }
    public void jump(){
        System.out.println(this.name+"正在跳");
    }
    public void eat(){//重写eat方法
        System.out.println(this.name+"吃的是猫粮");
    }
}
class Bird{
    public String name;//鸟自己的姓名
    public void fly(){
        System.out.println(this.name+"正在飞");
    }
}
public class Main {
    public static void func(Animal animal){//Cat是Animal的子类，animal接收mimi
        animal.eat();
    }
    //第三种：返回值
    public static Animal func2(){
         Cat cat=new Cat("mimi");//Cat是Animal的子类
        return cat;
    }

    public static void main(String[] args) {
        Animal animal=new Cat("mimi");
    }
    public static void main4(String[] args) {
        //第一种方式：直接赋值
        Animal animal=new Cat("zhuzhu");//向上转型，把派生类的对象给了父类
        //父类的引用，引用子类对象
        //向下转型
        Cat cat=(Cat)animal;
       cat.jump();//父类引用，引用子类对象的时候，只能访问自己的属性或方法
        animal.eat();//此时，当Cat也重写了eat方法之后，产生效果：动态绑定
        //子类重写了eat方法，访问的其实还是animal的eat，只不过在运行时发生了动态绑定
        //第二种方式：方法的传参
        //Cat cat=new Cat("mimi");
        func(cat);
        cat.jump();//Cat继承于Animal不仅能访问自己的，也能访问Animal的方法或者是成员
    }

    public static void main3(String[] args) {
        Cat cat=new Cat("mimi");//实例化一个猫，
        // mimi传给了猫的构造方法（第一步）
        //cat.name="mimi";//访问普通成员变量，初始化name
        Animal animal=new Animal("huu");
        Bird bird=new Bird();
        bird.name="bb";
    }






    public static void main2(String[] args) {
        Date date = new Date();// 得到一个毫秒级别的时间戳
        System.out.println(date.getTime());
    }
    public static void main1(String[] args) {
        Main2 main=new Main2();
        System.out.println(main.val);
    }
}
